home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / cmprss.exe / DPRESS.CPP < prev    next >
C/C++ Source or Header  |  1993-01-26  |  1KB  |  68 lines

  1. #include <string.h>
  2. #include "decpress.cls"
  3. #include "type.h"
  4.  
  5. int cpifstream::decompress(uchar *inbuff, uint inbuff_len, uchar *outbuff)
  6.     {
  7. uint ctrl_bits;
  8. uint ctrl_mask=0;
  9. uchar *inbuff_idx=inbuff;
  10. uchar *outbuff_idx=outbuff;
  11. uchar *inbuff_end=inbuff+inbuff_len;
  12. uint cmd;
  13. uint cnt;
  14. uint ofs;
  15. uint len;
  16.  
  17.     while (inbuff_idx < inbuff_end)
  18.         {
  19.         if ((ctrl_mask>>=1)==0)
  20.             {
  21.             ctrl_bits=*(uint*)inbuff_idx;
  22.             inbuff_idx+=2;
  23.             ctrl_mask=0x8000;
  24.             }
  25.  
  26.         if ((ctrl_bits & ctrl_mask)==0)
  27.             {
  28.             *outbuff_idx++=*inbuff_idx++;
  29.             continue;
  30.             }
  31.  
  32.         cmd=(*inbuff_idx>>4) & 0x0F;
  33.         cnt=*inbuff_idx++ & 0x0F;
  34.  
  35.         switch(cmd)
  36.             {
  37.             case 0:
  38.                 cnt+=3;
  39.                 memset(outbuff_idx,*inbuff_idx++,cnt);
  40.                 outbuff_idx+=cnt;
  41.                 break;
  42.             case 1:
  43.                 cnt+=(*inbuff_idx++<<4);
  44.                 cnt+=19;
  45.                 memset(outbuff_idx,*inbuff_idx++,cnt);
  46.                 outbuff_idx+=cnt;
  47.                 break;
  48.             case 2:
  49.                 ofs=cnt+3;
  50.                 ofs+=(*inbuff_idx++<<4);
  51.                 cnt=*inbuff_idx++;
  52.                 cnt+=16;
  53.                 memcpy(outbuff_idx, outbuff_idx-ofs, cnt);
  54.                 outbuff_idx+=cnt;
  55.                 break;
  56.             default:
  57.                 ofs=cnt+3;
  58.                 ofs+=(*inbuff_idx++<<4);
  59.                 memcpy(outbuff_idx,outbuff_idx-ofs,cmd);
  60.                 outbuff_idx+=cmd;
  61.                 break;
  62.             }
  63.         }
  64.     return outbuff_idx-outbuff;
  65.     }
  66.  
  67.  
  68.